package com.cn.utils;

import com.cn.pojo.Category;
import com.cn.pojo.SysMenu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 功能描述: <br>
 *
 * @program: wx-nimi-bank
 * @description: 菜品菜单树
 * @author: Mr.TYJ
 * @create: 2022-05-26 17:04
 **/
public class CategoryMenuTreeBuilder {

    public static List<Category> build(List<Category> menus){
        //2.查看一下有没有获取到菜单
        menus.forEach(menu -> {
            System.out.println(menu.toString());
        });
        //3.定义一个最后的结果来存储菜单树
        List<Category> menuList=new ArrayList<>();

        //4.先查询一级菜单
        for (Category menu :menus){
            //如果getPid是0则是父级菜单
            if (menu.getPid()==0){
                //将父级菜单添加到menuList中
                menuList.add(menu);
            }
        }
        //对一级菜单排序

        Collections.sort(menus,Category.order());

        //5.为一级菜单设置子菜单
        for (Category menu: menuList
        ) {
            //这里需要通过递归的方法去设置子菜单(因为子菜单里可能还有子菜单)
            menu.setChildMenus(getChild(menu.getId(),menus));
        }
        return menuList;
    }

    /**
     * 递归获取子菜单
     * @param id 父级id
     * @param menus 所有菜单列表
     * @return
     */
    private static List<Category> getChild(Long id, List<Category> menus) {
        //子菜单
        List<Category> childList=new ArrayList<>();
        //1.如何判断一个菜单是另一个菜单的子菜单
        //1.该菜单的父级id必须是穿过来的id，不能是按钮
        for (Category menu: menus
        ) {
            //如果满足两个条件则就是子菜单的id
            if (menu.getPid().equals(id)&&menu.getLevel()==1){
                childList.add(menu);
            }
        }

        //这里设置二级以上的菜单，（最多是三级菜单）
        for (Category menu: childList
        ) {
            menu.setChildMenus(getChildTwo(menu.getId(),menus));
        }
        //对子集菜单排序
        Collections.sort(childList,Category.order());
        //判断递归结束的条件


        return childList;
    }

    /**
     * 三级菜单
     * @param id
     * @param menus
     * @return
     */
    private static List<Category> getChildTwo(Long id, List<Category> menus) {
        //子菜单
        List<Category> childList=new ArrayList<>();
        //1.如何判断一个菜单是另一个菜单的子菜单
        //1.该菜单的父级id必须是穿过来的id，不能是按钮
        for (Category menu: menus
        ) {
            //如果满足两个条件则就是子菜单的id
            if (menu.getPid().equals(id)&&menu.getLevel()==2){
                childList.add(menu);
            }
        }

        //这里设置二级以上的菜单，（最多是三级菜单）
        for (Category menu: childList
        ) {
            menu.setChildMenus(getChild(menu.getId(),menus));
        }
        //对子集菜单排序
        Collections.sort(childList,Category.order());
        //判断递归结束的条件

        if (childList.size() == 0){
            return null;
        }
        return childList;
    }

}
